#include "oled.h"
#include "font.h"
#include <string.h>

// OLED显示缓冲区
static uint8_t displayBuffer[OLED_HEIGHT/8][OLED_WIDTH];
static OLEDDisplayMode currentMode = OLED_NORMAL;

// 写入一个字节到显示缓冲区
static void WriteByteToBuffer(uint8_t x, uint8_t y, uint8_t data)
{
    if (x >= OLED_WIDTH || y >= OLED_HEIGHT/8) {
        return;
    }
    displayBuffer[y][x] = data;
}

// 写入字符点阵到显示缓冲区
static void WriteCharToBuffer(uint8_t x, uint8_t y, const uint8_t *data, uint8_t width, uint8_t height)
{
    uint8_t i, j, k;
    uint8_t bytes_per_column = (height + 7) / 8;
    
    for (i = 0; i < width; i++) {
        for (j = 0; j < bytes_per_column; j++) {
            if (y + j < OLED_HEIGHT/8) {
                WriteByteToBuffer(x + i, y + j, data[i + j * width]);
            }
        }
    }
}

// OLED初始化
SystemStatus OLED_Init(void)
{
    // TODO: 初始化OLED硬件
    // TODO: 配置I2C或SPI接口
    // TODO: 初始化OLED控制器
    
    // 清空显示缓冲区
    memset(displayBuffer, 0, sizeof(displayBuffer));
    
    // 设置默认显示模式
    OLED_SetDisplayMode(OLED_NORMAL);
    
    return SYSTEM_OK;
}

// 清屏
void OLED_Clear(void)
{
    memset(displayBuffer, 0, sizeof(displayBuffer));
    OLED_Refresh();
}

// 显示单个ASCII字符
void OLED_ShowChar(uint8_t x, uint8_t y, char chr)
{
    if (chr < 0x20 || chr > 0x7E) {
        return;
    }
    
    const uint8_t *char_data = ASCII_6x8[chr - 0x20];
    WriteCharToBuffer(x, y, char_data, 6, 8);
    OLED_Refresh();
}

// 显示ASCII字符串
void OLED_ShowString(uint8_t x, uint8_t y, const char *str)
{
    uint8_t x_pos = x;
    
    while (*str) {
        if (*str >= 0x20 && *str <= 0x7E) {
            const uint8_t *char_data = ASCII_6x8[*str - 0x20];
            WriteCharToBuffer(x_pos, y, char_data, 6, 8);
            x_pos += 6;
        }
        str++;
    }
    
    OLED_Refresh();
}

// 显示中文字符串
void OLED_ShowChinese(uint8_t x, uint8_t y, const char *str)
{
    uint8_t x_pos = x;
    
    while (*str) {
        if (*str < 0x80) {
            // ASCII字符
            if (*str >= 0x20 && *str <= 0x7E) {
                const uint8_t *char_data = ASCII_6x8[*str - 0x20];
                WriteCharToBuffer(x_pos, y, char_data, 6, 8);
                x_pos += 6;
            }
            str++;
        } else {
            // 中文字符
            // 这里需要根据实际的中文编码方式来获取字库数据
            // 这里假设使用GB2312编码，每个中文字符占用2个字节
            const uint8_t *char_data = CHINESE_16x16[0];  // 临时使用第一个汉字，需要实现查找逻辑
            WriteCharToBuffer(x_pos, y, char_data, 16, 16);
            x_pos += 16;
            str += 2;
        }
    }
    
    OLED_Refresh();
}

// 显示数字
void OLED_ShowNum(uint8_t x, uint8_t y, uint32_t num, uint8_t len)
{
    char str[11];  // 最大10位数字加结束符
    uint8_t i;
    
    // 数字转字符串
    for (i = 0; i < len; i++) {
        str[len - i - 1] = '0' + (num % 10);
        num /= 10;
    }
    str[len] = '\0';
    
    // 显示字符串
    OLED_ShowString(x, y, str);
}

// 设置显示模式
void OLED_SetDisplayMode(OLEDDisplayMode mode)
{
    currentMode = mode;
    OLED_Refresh();
}

// 更新显示
void OLED_Refresh(void)
{
    // TODO: 将显示缓冲区的内容写入OLED控制器
    // TODO: 根据currentMode处理显示数据
}

// OLED进入低功耗模式
SystemStatus OLED_EnterLowPower(void)
{
    // TODO: 关闭OLED显示
    // TODO: 设置控制器为低功耗模式
    return SYSTEM_OK;
}

// OLED退出低功耗模式
SystemStatus OLED_ExitLowPower(void)
{
    // TODO: 恢复OLED显示
    // TODO: 恢复显示内容
    OLED_Refresh();
    return SYSTEM_OK;
} 